CODE 137. Word Break II

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2013/11/24/2013-11-24-CODE 137 Word Break II/

访问原文「CODE 137. Word Break II

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].
A solution is ["cats and dog", "cat sand dog"].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public ArrayList<String> wordBreak(String s, Set<String> dict) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
Set<String> unused = new HashSet<String>();
boolean touched = false;
Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>();
for (String dic : dict) {
if (!s.contains(dic)) {
unused.add(dic);
}
}
dict.removeAll(unused);
for (int i = 0; i < s.length(); i++) {
for (String sub : dict) {
String subTmp = s.substring(i);
int start = i;
while (subTmp.contains(sub)) {
int index = subTmp.indexOf(sub);
if (map.containsKey(start + index)) {
map.get(start + index)
.add(start + index + sub.length());
} else {
map.put(start + index, new HashSet<Integer>());
map.get(start + index)
.add(start + index + sub.length());
}
subTmp = subTmp.substring(index + sub.length());
start = start + index + sub.length();
if (start >= s.length()) {
touched = true;
}
}
}
}
if (!touched) {
return new ArrayList<String>();
}
return wbreak(s, s.length(), map, 0);
}
ArrayList<String> wbreak(String s, int length,
Map<Integer, Set<Integer>> map, int x) {
if (!map.containsKey(x)) {
return new ArrayList<String>();
}
ArrayList<String> results = new ArrayList<String>();
for (int index : map.get(x)) {
String subString = s.substring(x, index);
if (index >= length) {
results.add(subString);
} else {
ArrayList<String> subResults = wbreak(s, length, map, index);
if (subResults.isEmpty()) {
continue;
} else {
for (String subResult : subResults) {
String result = subString + " " + subResult;
results.add(result);
}
}
}
}
return results;
}
Jerky Lu wechat
欢迎加入微信公众号